#Boa:Frame:estadisticas

import wx
import wx.grid
import consultasBD
import utiles

def create(parent):
    return estadisticas(parent)

[wxID_ESTADISTICAS, wxID_ESTADISTICASBUTTON1, wxID_ESTADISTICASBUTTON2, 
 wxID_ESTADISTICASBUTTON3, wxID_ESTADISTICASBUTTON4, 
 wxID_ESTADISTICASCOMBOBOX1, wxID_ESTADISTICASDATEPICKERCTRL1, 
 wxID_ESTADISTICASDATEPICKERCTRL2, wxID_ESTADISTICASGRID1, 
 wxID_ESTADISTICASPANEL1, wxID_ESTADISTICASRADIOBUTTON1, 
 wxID_ESTADISTICASRADIOBUTTON2, wxID_ESTADISTICASRADIOBUTTON3, 
 wxID_ESTADISTICASRADIOBUTTON4, wxID_ESTADISTICASRADIOBUTTON5, 
 wxID_ESTADISTICASSTATICTEXT1, wxID_ESTADISTICASSTATICTEXT2, 
 wxID_ESTADISTICASSTATICTEXT3, wxID_ESTADISTICASSTATICTEXT4, 
 wxID_ESTADISTICASTEXTCTRL1, 
] = [wx.NewId() for _init_ctrls in range(20)]

class estadisticas(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_ESTADISTICAS, name='estadisticas',
              parent=prnt, pos=wx.Point(276, 158), size=wx.Size(970, 412),
              style=wx.DEFAULT_FRAME_STYLE, title='Estadisticas de Clientes')
        self.SetClientSize(wx.Size(962, 385))

        self.panel1 = wx.Panel(id=wxID_ESTADISTICASPANEL1, name='panel1',
              parent=self, pos=wx.Point(0, 0), size=wx.Size(962, 385),
              style=wx.TAB_TRAVERSAL)

        self.staticText1 = wx.StaticText(id=wxID_ESTADISTICASSTATICTEXT1,
              label='Sucursal', name='staticText1', parent=self.panel1,
              pos=wx.Point(16, 8), size=wx.Size(40, 13), style=0)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_ESTADISTICASCOMBOBOX1,
              name='comboBox1', parent=self.panel1, pos=wx.Point(16, 24),
              size=wx.Size(160, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.staticText2 = wx.StaticText(id=wxID_ESTADISTICASSTATICTEXT2,
              label='Periodo: desde...', name='staticText2', parent=self.panel1,
              pos=wx.Point(184, 8), size=wx.Size(84, 13), style=0)

        self.datePickerCtrl1 = wx.DatePickerCtrl(id=wxID_ESTADISTICASDATEPICKERCTRL1,
              name='datePickerCtrl1', parent=self.panel1, pos=wx.Point(184, 24),
              size=wx.Size(80, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)

        self.datePickerCtrl2 = wx.DatePickerCtrl(id=wxID_ESTADISTICASDATEPICKERCTRL2,
              name='datePickerCtrl2', parent=self.panel1, pos=wx.Point(272, 24),
              size=wx.Size(80, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)

        self.staticText3 = wx.StaticText(id=wxID_ESTADISTICASSTATICTEXT3,
              label='Hasta', name='staticText3', parent=self.panel1,
              pos=wx.Point(272, 8), size=wx.Size(28, 13), style=0)

        self.radioButton1 = wx.RadioButton(id=wxID_ESTADISTICASRADIOBUTTON1,
              label='100', name='radioButton1', parent=self.panel1,
              pos=wx.Point(384, 24), size=wx.Size(40, 13), style=0)
        self.radioButton1.SetValue(True)

        self.radioButton2 = wx.RadioButton(id=wxID_ESTADISTICASRADIOBUTTON2,
              label='50', name='radioButton2', parent=self.panel1,
              pos=wx.Point(424, 24), size=wx.Size(40, 13), style=0)
        self.radioButton2.SetValue(False)

        self.radioButton3 = wx.RadioButton(id=wxID_ESTADISTICASRADIOBUTTON3,
              label='20', name='radioButton3', parent=self.panel1,
              pos=wx.Point(464, 24), size=wx.Size(40, 13), style=0)
        self.radioButton3.SetValue(False)

        self.radioButton4 = wx.RadioButton(id=wxID_ESTADISTICASRADIOBUTTON4,
              label='10', name='radioButton4', parent=self.panel1,
              pos=wx.Point(504, 24), size=wx.Size(32, 13), style=0)
        self.radioButton4.SetValue(False)

        self.staticText4 = wx.StaticText(id=wxID_ESTADISTICASSTATICTEXT4,
              label='Los mejores', name='staticText4', parent=self.panel1,
              pos=wx.Point(384, 8), size=wx.Size(57, 13), style=0)

        self.button1 = wx.Button(id=wxID_ESTADISTICASBUTTON1, label='Buscar',
              name='button1', parent=self.panel1, pos=wx.Point(560, 16),
              size=wx.Size(75, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnBuscar,
              id=wxID_ESTADISTICASBUTTON1)

        self.button3 = wx.Button(id=wxID_ESTADISTICASBUTTON3, label='Imprimir',
              name='button3', parent=self.panel1, pos=wx.Point(640, 16),
              size=wx.Size(75, 23), style=0)
        self.button3.Bind(wx.EVT_BUTTON, self.OnImprimir,
              id=wxID_ESTADISTICASBUTTON3)

        self.button4 = wx.Button(id=wxID_ESTADISTICASBUTTON4, label='Limpiar',
              name='button4', parent=self.panel1, pos=wx.Point(720, 16),
              size=wx.Size(75, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnLimpiar,
              id=wxID_ESTADISTICASBUTTON4)

        self.button2 = wx.Button(id=wxID_ESTADISTICASBUTTON2, label='Salir',
              name='button2', parent=self.panel1, pos=wx.Point(880, 16),
              size=wx.Size(75, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnSalir,
              id=wxID_ESTADISTICASBUTTON2)

        self.textCtrl1 = wx.TextCtrl(id=wxID_ESTADISTICASTEXTCTRL1,
              name='textCtrl1', parent=self.panel1, pos=wx.Point(560, 48),
              size=wx.Size(144, 21), style=0, value='')
        self.textCtrl1.SetEditable(False)

        self.grid1 = wx.grid.Grid(id=wxID_ESTADISTICASGRID1, name='grid1',
              parent=self.panel1, pos=wx.Point(16, 72), size=wx.Size(936, 304),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK,
              self.OnDobleClickIzquierdo)

        self.radioButton5 = wx.RadioButton(id=wxID_ESTADISTICASRADIOBUTTON5,
              label='300', name='radioButton5', parent=self.panel1,
              pos=wx.Point(384, 40), size=wx.Size(81, 13), style=0)
        self.radioButton5.SetValue(False)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.inicializar()

    def ajustarAnchoColumnas(self):
        for y in xrange(self.grid1.GetNumberCols()):
            self.grid1.AutoSizeColumn(y,True)

    def inicializar(self):
        columnas = ['Numero','Nombre','Monto','Direccion','Telefono','e-mail','Ultima\noperacion']
        self.grid1.CreateGrid(1,len(columnas))
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)

        self.ajustarAnchoColumnas()
        self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        self.grid1.EnableEditing(False)
        self.grid1.Refresh()

        consultaSQL = "SELECT * FROM sucursales WHERE 1"
        resultadoSUC = consultasBD.ordenCrudaDict(consultaSQL)
        for item in resultadoSUC:
            self.comboBox1.Append(item["nombre"])

        fechasExtremas = utiles.getDaysExtreme()
        primerDia = utiles.getDaysExtreme()[0]
        utiles.cargar_fecha(primerDia, self.datePickerCtrl1)

    def OnSalir(self, event):
        self.Close()

    def fechaUltimaOperacion(self,idcliente):
        r1 = "SELECT DISTINCT vccp.fecha \n"
        r2 = "FROM vtas_valores vv, vtas_ctasctestienepagos vccp \n"
        r3 = "WHERE vv.idcliente='"+idcliente+"' \n"
        r4 = "      AND vv.idrecibo=vccp.idrecibo \n"
        r5 = "ORDER BY vccp.fecha DESC LIMIT 1 "
        sql = r1+r2+r3+r4+r5
        datos1 = consultasBD.ordenCruda(sql)
        try:
            fecha1 = str(datos1[0][0])
        except:
            fecha1 = ""
        r1 = "SELECT fecha FROM ventas WHERE idcliente='"+idcliente+"' \n"
        r2 = "ORDER BY fecha DESC LIMIT 1 "
        sql = r1+r2
        datos2 = consultasBD.ordenCruda(sql)
        try:
            fecha2 = str(datos2[0][0])[:10]
        except:
            fecha2 = ""
        if fecha1>fecha2:
            fecha1 = utiles.invertirFecha2(fecha1)
            return fecha1
        else:
            fecha2 = utiles.invertirFecha2(fecha2)
            return fecha2

    def OnBuscar(self, event):
        if self.comboBox1.GetLabel()=="":
            utiles.mensaje(None,"Debe seleccionar la sucursal")
            self.comboBox1.SetFocus()
            return
        self.textCtrl1.SetLabel("PROCESANDO")
        limite = ""
        if self.radioButton1.GetValue():
            limite = " LIMIT 0,100 "
        if self.radioButton2.GetValue():
            limite = " LIMIT 0,50 "
        if self.radioButton3.GetValue():
            limite = " LIMIT 0,20 "
        if self.radioButton4.GetValue():
            limite = " LIMIT 0,10 "
        if self.radioButton5.GetValue():
            limite = " LIMIT 0,300 "
        self.OnLimpiar(None)
        sucursal = self.comboBox1.GetSelection()
        fechainicio = utiles.invertirFecha(self.datePickerCtrl1.GetLabel())
        fechafin = utiles.invertirFecha(self.datePickerCtrl2.GetLabel())
        fechainicio = fechainicio+" 00:00:00"
        fechafin = fechafin+" 23:59:59"
        
        condicionfecha = " v.fecha BETWEEN '"+fechainicio+"' AND '"+fechafin+"' "
        
        r1 = "SELECT v.idcliente, c.nombre, c.direccion, c.localidad, \n"
        r2 = "       c.telefono, c.email, SUM( v.totalfactura ) AS facturado \n"
        r3 = "FROM ventas AS v, cliente AS c \n"
        r4 = "WHERE  "+condicionfecha+" \n"
        r5 = "AND c.idcliente = v.idcliente \n"
        r6 = "GROUP BY v.idcliente \n"
        r7 = "ORDER BY SUM( v.totalfactura ) DESC \n"+limite
        consultaSQL = r1+r2+r3+r4+r5+r6+r7

        resultados, conecta = consultasBD.ordenCrudaDictRemota(consultaSQL,sucursal)
        if not conecta:
            utiles.mensaje(None,"No hay conexion con\n"+self.comboBox1.GetLabel())
            self.comboBox1.SetFocus()
            return
        if resultados == () or resultados == None:
            utiles.mensaje(None,"No hay datos que mostrar")
            self.comboBox1.SetFocus()
            return
        
        fila = 0
        for item in resultados:
            #Numero,Nombre,Monto,Direccion,Telefono,e-mail
            #0      1      2     3         4        5
            idcliente = item["idcliente"]
            if idcliente == "1-2": continue
            nombre = item["nombre"][:30]
            direccion = item["direccion"]+" / "+item["localidad"]
            telefono = item["telefono"]
            email = item["email"]
            facturado = str(item["facturado"])
            ultimaoperacion = self.fechaUltimaOperacion(idcliente)

            self.grid1.SetCellValue(fila,0,idcliente)
            self.grid1.SetCellValue(fila,1,nombre)
            self.grid1.SetCellValue(fila,2,facturado)
            self.grid1.SetCellAlignment(fila,2,wx.ALIGN_RIGHT,wx.ALIGN_CENTRE)
            self.grid1.SetCellValue(fila,3,direccion)
            self.grid1.SetCellValue(fila,4,telefono)
            self.grid1.SetCellValue(fila,5,email)
            self.grid1.SetCellValue(fila,6,ultimaoperacion)
            self.grid1.SetCellAlignment(fila,6,wx.ALIGN_CENTRE,wx.ALIGN_CENTRE)
            self.grid1.AppendRows()
            fila+= 1
            
        self.ajustarAnchoColumnas()
        self.textCtrl1.SetLabel(self.comboBox1.GetLabel())
        self.button2.SetFocus()

    def OnLimpiar(self, event):
        self.textCtrl1.SetLabel("")
        self.grid1.ClearGrid()
        for fila in xrange(self.grid1.GetNumberRows()):
            self.grid1.DeleteRows()
        self.grid1.AppendRows()
        self.comboBox1.SetFocus()

    def OnDobleClickIzquierdo(self, event):
        sucActiva = str(utiles.getSucursalActiva())
        sucElegida = str(self.comboBox1.GetSelection()+1)
        if sucActiva != sucElegida:
            utiles.mensaje(None,"No puede ver detalle ventas para la sucursal")
            return
        fila = self.grid1.GetGridCursorRow()
        idcliente = self.grid1.GetCellValue(fila,0)
        if idcliente == "":
            return
        nombre = self.grid1.GetCellValue(fila,1)
        import ListadoFacturas
        dlg = ListadoFacturas.Dialog1(self,idcliente,nombre)
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy() 

    def OnImprimir(self, event):
        print "Generando listado"
        
        f=open("c:\\erpsussan.doc\\reporte-TopClientes.html","w")
        numeroPagina = 1
        nrosuc,nombresuc = utiles.datosSucursal()
        
        totalItemPorPagina = 50
        totalPaginas = int(self.grid1.GetNumberRows()-1) / totalItemPorPagina 
        totalPaginas+= 1

        def encabezadoPagina(texto):
            fecha = utiles.getfechaTime()
            
            fechadesde = str(self.datePickerCtrl1.GetLabel())
            fechahasta = str(self.datePickerCtrl2.GetLabel())
            
            a = '<table width="100%" cellspacing="0" border="0">\n'
            a+= '<tr>\n'
            a+= '<td valign="top" align="left" width="33%">'
            a+= 'SUSSAN BOUTIQUE Top Clientes<br>'+nombresuc+'</td>\n'
            a+= '<td valign="top" align="left" width="34%">'
            a+= 'Sucursal: '+self.textCtrl1.GetLabel()+'<br>'
            a+= '<font size="0.1">Desde: '+fechadesde+' Hasta: '+fechahasta+'</font></td>\n'
            a+= '<td valign="top" align="right" width="33%">'+fecha
            a+= '<br><font size="0.1">P&aacute;gina '+str(numeroPagina)+' / '+str(totalPaginas)+'</font></td>\n'
            a+= '</tr>\n'
            a+= '</table></font>\n'
            a+= '<hr>\n'
            texto+= a
            return texto
        
        def encabezadoTabla(texto):
            a = '<table width="100%" cellspacing="1" border="0"> \n'
            a+= '<tr>\n'
            a+= '<td valign="top" align="right"><font size="0.1">orden</font></td>\n'
            a+= '<td valign="top" align="right"><font size="0.1">N&uacute;mero<br>Cliente</font></td>\n'
            a+= '<td valign="top" align="left"><font size="0.1">Nombre</font></td>\n'
            a+= '<td valign="top" align="right"><font size="0.1">Monto</font></td>\n'
            a+= '<td valign="top" align="right"> </td>\n'
            a+= '<td valign="top" align="left"><font size="0.1">Direcci&oacute;n</font></td>\n'
            a+= '<td valign="top" align="left"><font size="0.1">Tel&eacute;fono</font></td>\n'
            a+= '<td valign="top" align="left"><font size="0.1">e-mail</font></td>\n'
            a+= '<td valign="top" align="left"><font size="0.1">Ultima<br>Operaci&oacute;n</font></td>\n'
            a+= '</tr>\n'
            a+= '<tr>\n'
            a+= '<td colspan="9"><hr></td>\n'
            a+= '</tr>\n'
            texto+= a
            return texto
        
        cadena = '<?xml version="1.0" encoding="utf-8" ?> \n'
        cadena+= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> \n'
        cadena+= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> \n'
        cadena+= '<head> \n'
        cadena+= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> \n'
        cadena+= '<meta name="generator" content="Docutils 0.4.1: http://docutils.sourceforge.net/" /> \n'
        cadena+= '<title>Sussan Boutique</title> \n'
        cadena+= '</head> \n'
        cadena+= '<body> \n'

        cadena = encabezadoPagina(cadena)
        cadena = encabezadoTabla(cadena)
        f.write(cadena)
        
        renglon = 0
        orden = 0
        for i in xrange(self.grid1.GetNumberRows()-1):
        #Numero Cliente,Nombre,Monto,Direccion,Telefono,e-mail
        #0              1      2     3         4        5
            orden+=1
            idcliente = self.grid1.GetCellValue(i,0)
            nombre = self.grid1.GetCellValue(i,1)[:20]
            monto = self.grid1.GetCellValue(i,2)
            direccion = self.grid1.GetCellValue(i,3)[:30]
            telefono = self.grid1.GetCellValue(i,4)[:15]
            email = self.grid1.GetCellValue(i,5)
            fecha = self.grid1.GetCellValue(i,6)
            
            cadena = '<tr>\n'
            cadena+= '<td valign="center" align="right"><font size="0.1">'+str(orden)+'</font></td> \n'
            cadena+= '<td valign="center" align="right"><font size="0.1">'+idcliente+'</font></td> \n'
            cadena+= '<td valign="center" align="left"><font size="0.1">'+nombre+'</font></td> \n'
            cadena+= '<td valign="center" align="right"><font size="0.1">'+monto+'</font></td> \n'
            cadena+= '<td valign="center" align="right"></td> \n'
            cadena+= '<td valign="center" align="left"><font size="0.1">'+direccion+'</font></td> \n'
            cadena+= '<td valign="center" align="left"><font size="0.1">'+telefono+'</font></td> \n'
            cadena+= '<td valign="center" align="left"><font size="0.1">'+email+'</font></td> \n'
            cadena+= '<td valign="center" align="left"><font size="0.1">'+fecha+'</font></td> \n'
            cadena+= '</tr>\n'
            try:
                f.write(cadena)
            except:
                print cadena
            
            renglon+= 1
            
            if renglon >= totalItemPorPagina :
                renglon = 0
                f.write("</table><!-- salto de pagina -->\n")
                f.write("<p STYLE='page-break-after: always;'></p>\n")
##                for i in xrange(numeroPagina):
##                    f.write("<br>\n")
                numeroPagina+= 1
                cadena = encabezadoPagina("")
                cadena = encabezadoTabla(cadena)
                f.write(cadena)
            
        cadena = '</table>\n'
        cadena+= '<br>Total &iacute;tems: '+str(self.grid1.GetNumberRows()-1)+'\n'
        cadena+= '<br>Total p&aacute;ginas: '+str(numeroPagina)+'\n'
        cadena+= '</body>\n</html>\n'
        f.write(cadena)
        f.close()

        self.button3.SetFocus()

        import os
        os.system("taskkill /IM firefox.exe /F")
        os.system("c:\\explorer.lnk c:\\erpsussan.doc\\reporte-TopClientes.html")
